package endPoint.codeLayer;

/**
 * Implementa un oggetto capace di decodificare una stringa codificata secondo un codice 
 * a ripetizione Rn.
 * Ha necessità di conoscere il parametro n usato per la codifica.
 * 
 * @author calvelli
 */
public class RepetitionDecoder implements Decoder{
   
    private int n;
    
    /**
     * Crea un decoder capace di decodificare stringhe codificate con Rn
     * @param n : numero di ripetizioni usate per la codifica.
     */
   public RepetitionDecoder(int n){
       this.n = n;
   }//costruttore
   
   
   /**
    * Decodifica la stringa ricevuta come parametro cercando di correggere eventuali errori.
    * @param toDecode : stringa da decodificare
    * @return la stringa risultante dalla decodifica
    */
   public String decode(String toDecode) {
		//StringBuilder result = new StringBuilder();

		// se c'� del residuo precedente lo unisco a quello che mi arriva ora
//		if (!residuo.equals("")) {
//			toDecode = residuo + toDecode;
//		}
		// vuol dire che ho almeno n bit da poter leggere!
//		int numSottoIstanze = (int) toDecode.length() / n;
//
//		for (int i = 0; i < numSottoIstanze; i++) {
//			if (analizeOk(toDecode.substring(n))) {
//				result.append(toDecode.charAt(0));
//				toDecode = toDecode.substring(n);
//			} else {
//				// fai qualcosa bho
//			}
//		}
//		// se c'� del residuo lo aggiungo
//		residuo = residuo.concat(toDecode);
//
//		return result.toString
            
            
            int size=toDecode.length();
            if(size % n != 0)
                throw new RuntimeException("Lunghezza stringa da decodificare sbagliata");
            
            //prendo n bit alla volta
            int begin = 0, end = n;
            int findedBits0 = 0, findedBits1 = 0;
            String result = new String(), subString = new String();
            while(end <= size){
                subString = toDecode.substring(begin, end);
                for(int i=0; i<n; i++){
                    if(subString.charAt(i) == '0')
                        findedBits0 ++;
                    else
                        findedBits1 ++;
                }//for i
                
                if(findedBits0 > findedBits1)
                    result += "0";
                else
                    result += "1";
                
                begin = end;
                end =  begin + n;
                findedBits0 = 0;
                findedBits1 = 0;
            }//while
            
            return result;
                
	}//decode

}//RepetitionDecoder
